/**
 * edgeGraph.h
 *
 * @brief gestisce le carattieristiche fisiche e statiche del grafo
 *
 * EdgeGraph e' una struttura che rappresenta i tempi, le quantita' e profitti inerenti ad un arco del grafo.
 *
 *  Created on: May 22, 2013
 *      Author: koldar
 */

#ifndef EDGEGRAPH_H_
#define EDGEGRAPH_H_

#include <limits.h>
#include <stdbool.h>
#include <stdio.h>

/** valore dei tempi che viene attribuito agli archi non esistenti nel grafo */
#define INFINITE (INT_MAX/6)*5

/** rappresenta una struttura contenente parametri statici di un arco di un grafo.
 * Un grafo e' composto principalmente da una matrice di queste strutture
 */
typedef struct EdgeGraph {
	/** rappresenta il tempo per percorrere una solva volta l'arco*/
	int t;
	/** rappresenta la quantita' da diminuire al'interno della capacita' di un camion per ottnere il profitto p offerto dall'arco*/
	int d;
	/** rappresenta il profitto ottenuto squalora si soddisfasse la domanda dell'arco*/
	float p;
} EdgeGraph;

/** Una matrice di adiacenza come un array di archi, ordinato con una certa lessicografica. */
typedef EdgeGraph* PedgeGraph;
/** Un type di comodo per rendere il più chiaro possibile il codice*/
typedef EdgeGraph** AdjMat;


/**costruisce un nuovo edge. Utile in combinazione con graph.am[x][y]=edge.
 *
 * @param t indica il costo temporale dell'arco
 * @param d indica la domanda richiesta dall'arco
 * @param p indica il profitto ricavabile dall'arco
 */
PedgeGraph initEdgeGraph(int t, int d, float p);

/**elimina le caratteristiche fisiche dell'arco dalla memoria
 *
 * \pre
 *  \li edge non nullo
 *
 * @param edge l'edge da eliminare dalla memoria
 */
void freeEdgeGraph(PedgeGraph edge);

/**
 *
 * @param edge l'arco da verificare
 * @return TRUE se l'arco viene considerato dall'algoritmo a tempo infinito, FALSE altrimenti
 */
bool isEdgeGraphExist(PedgeGraph edge);

/**
 * @return vero sse domanda E profitto dell'arco sono non nulli.
 */
bool isEdgeGraphProfitable(PedgeGraph p_edgeGraph);

/** chissene */
void printEdgeGraph(FILE* f, PedgeGraph p_edge);

#endif /* EDGEGRAPH_H_ */
